Reactã®useActionStateããã¯ã䜿ãããããŠã³ã¹ã«ããã¢ã¯ã·ã§ã³ã®ã¬ãŒãå¶éãå®è£ ããæ¹æ³ã解説ãã€ã³ã¿ã©ã¯ãã£ããªã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšUXãæé©åããŸãã
React useActionStateïŒãããŠã³ã¹ãå®è£ ãã¢ã¯ã·ã§ã³ã®ã¬ãŒãå¶éãæé©åãã
çŸä»£ã®Webã¢ããªã±ãŒã·ã§ã³ã«ãããŠããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ãå¹ççã«åŠçããããšã¯éåžžã«éèŠã§ãããã©ãŒã éä¿¡ãæ€çŽ¢ã¯ãšãªãããŒã¿æŽæ°ãªã©ã®ã¢ã¯ã·ã§ã³ã¯ããã°ãã°ãµãŒããŒãµã€ãã®æäœãããªã¬ãŒããŸããããããç¹ã«é£ç¶ããŠé«éã«ããªã¬ãŒããããµãŒããŒãžã®éå°ãªåŒã³åºãã¯ãããã©ãŒãã³ã¹ã®ããã«ããã¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®äœäžã«ã€ãªããå¯èœæ§ããããŸããããã§ãããŠã³ã¹ã圹ç«ã¡ãReactã®useActionStateããã¯ã¯ããã¯ãã«ã§æŽç·Žããã解決çãæäŸããŸãã
ãããŠã³ã¹ãšã¯ïŒ
ãããŠã³ã¹ãšã¯ãæéã®ãããã¿ã¹ã¯ãé »ç¹ã«å®è¡ãããªãããã«ããããã®ããã°ã©ãã³ã°ææ³ã§ãäžå®æéã®éã¢ã¯ãã£ãç¶æ ãç¶ããåŸã«é¢æ°ã®å®è¡ãé å»¶ãããŸããäŸãããªããEã³ããŒã¹ãµã€ãã§ååãæ€çŽ¢ããŠãããšæ³åããŠãã ããããããŠã³ã¹ããªããã°ãæ€çŽ¢ããŒã«å ¥åããããŒã¹ãããŒã¯ããšã«ãæ€çŽ¢çµæãååŸããããã®æ°ãããªã¯ãšã¹ãããµãŒããŒã«éä¿¡ãããŸããããã«ãããµãŒããŒã«éè² è·ããããããŠãŒã¶ãŒã«ã¯ã«ã¯ã«ã¯ããåå¿ã®æªãäœéšãæäŸããŠããŸãå¯èœæ§ããããŸãããããŠã³ã¹ã䜿çšãããšããŠãŒã¶ãŒãçæéïŒäŸïŒ300ããªç§ïŒã¿ã€ãã³ã°ã忢ããåŸã«ã®ã¿ãæ€çŽ¢ãªã¯ãšã¹ããéä¿¡ãããŸãã
ãããŠã³ã¹ã«useActionStateã䜿ãçç±
React 18ã§å°å
¥ãããuseActionStateã¯ãã¢ã¯ã·ã§ã³ããçããéåæãªç¶æ
æŽæ°ã管çããã¡ã«ããºã ãæäŸããç¹ã«React Server Componentså
ã§æçšã§ãããµãŒããŒã¢ã¯ã·ã§ã³ãšçµã¿åãããããšã§ãããŒãã£ã³ã°ç¶æ
ããšã©ãŒãã³ã³ããŒãã³ãå
ã§çŽæ¥ç®¡çã§ããããç¹ã«äŸ¿å©ã§ãããããŠã³ã¹æè¡ãšçµã¿åããããšãuseActionStateã¯ãŠãŒã¶ãŒå
¥åã«ãã£ãŠããªã¬ãŒããããµãŒããŒãšã®ã€ã³ã¿ã©ã¯ã·ã§ã³ããã¯ãªãŒã³ã§ããã©ãŒãã³ã¹ã®é«ãæ¹æ³ã§ç®¡çã§ããŸããuseActionStateãç»å Žããåã¯ããã®ãããªæ©èœã®å®è£
ã«ã¯useStateãuseEffectã䜿ã£ãæåã§ã®ç¶æ
管çãå¿
èŠã§ãããåé·ã§ãšã©ãŒãçºçããããã³ãŒãã«ãªããã¡ã§ããã
useActionStateã«ãããããŠã³ã¹ã®å®è£ ïŒã¹ãããã»ãã€ã»ã¹ãããã¬ã€ã
useActionStateã䜿çšãããããŠã³ã¹å®è£
ã®å®çšçãªäŸãèŠãŠãããŸãããããŠãŒã¶ãŒãå
¥åãã£ãŒã«ãã«ããã¹ããå
¥åãããã®å
¥åãããããã¹ãã§ãµãŒããŒãµã€ãã®ããŒã¿ããŒã¹ãæŽæ°ãããããçãé
å»¶ã®åŸã«ã®ã¿å®è¡ãããããšããã·ããªãªãèããŸãã
ã¹ããã1ïŒåºæ¬çãªã³ã³ããŒãã³ãã®ã»ããã¢ãã
ãŸããå ¥åãã£ãŒã«ããæã€ã·ã³ãã«ãªé¢æ°ã³ã³ããŒãã³ããäœæããŸãïŒ
import React, { useState, useCallback } from 'react';
import { useActionState } from 'react-dom/server';
async function updateDatabase(prevState: any, formData: FormData) {
// Simulate a database update
const text = formData.get('text') as string;
await new Promise(resolve => setTimeout(resolve, 500)); // Simulate network latency
return { success: true, message: `Updated with: ${text}` };
}
function MyComponent() {
const [debouncedText, setDebouncedText] = useState('');
const [state, dispatch] = useActionState(updateDatabase, {success: false, message: ""});
const handleChange = (event: React.ChangeEvent) => {
const newText = event.target.value;
setDebouncedText(newText);
};
return (
<form action={dispatch}>
<input type="text" name="text" value={debouncedText} onChange={handleChange} />
<button type="submit">Update</button>
<p>{state.message}</p>
</form>
);
}
export default MyComponent;
ãã®ã³ãŒãã§ã¯ïŒ
- å¿
èŠãªããã¯ã
useStateãuseCallbackãuseActionStateãã€ã³ããŒãããŸãã - ãµãŒããŒãµã€ãã®æŽæ°ãã·ãã¥ã¬ãŒãããéåæé¢æ°
updateDatabaseãå®çŸ©ããŸãããã®é¢æ°ã¯ãåã®ç¶æ ãšãã©ãŒã ããŒã¿ãåŒæ°ãšããŠåãåããŸãã useActionStateã¯ãupdateDatabase颿°ãšåæç¶æ ãªããžã§ã¯ãã§åæåãããŸããhandleChange颿°ã¯ãããŒã«ã«ã®ç¶æ debouncedTextãå ¥åå€ã§æŽæ°ããŸãã
ã¹ããã2ïŒãããŠã³ã¹ããžãã¯ã®å®è£
次ã«ããããŠã³ã¹ããžãã¯ãå°å
¥ããŸããsetTimeoutãšclearTimeout颿°ã䜿çšããŠã`useActionState`ããè¿ãããdispatch颿°ã®åŒã³åºããé
å»¶ãããŸãã
import React, { useState, useRef, useCallback } from 'react';
import { useActionState } from 'react-dom/server';
async function updateDatabase(prevState: any, formData: FormData) {
// Simulate a database update
const text = formData.get('text') as string;
await new Promise(resolve => setTimeout(resolve, 500)); // Simulate network latency
return { success: true, message: `Updated with: ${text}` };
}
function MyComponent() {
const [debouncedText, setDebouncedText] = useState('');
const [state, dispatch] = useActionState(updateDatabase, {success: false, message: ""});
const timeoutRef = useRef(null);
const handleChange = (event: React.ChangeEvent) => {
const newText = event.target.value;
setDebouncedText(newText);
if (timeoutRef.current) {
clearTimeout(timeoutRef.current);
}
timeoutRef.current = window.setTimeout(() => {
const formData = new FormData();
formData.append('text', newText);
dispatch(formData);
}, 300);
};
return (
<div>
<input type="text" value={debouncedText} onChange={handleChange} />
<p>{state.message}</p>
</div>
);
}
export default MyComponent;
倿Žç¹ã¯ä»¥äžã®éãã§ãïŒ
- ã¿ã€ã ã¢ãŠãIDãä¿åããããã«
timeoutRefãšããuseRefããã¯ã远å ããŸãããããã«ãããé å»¶æéãçµéããåã«ãŠãŒã¶ãŒãååºŠå ¥åããå Žåã«ã¿ã€ã ã¢ãŠããã¯ãªã¢ã§ããŸãã handleChangeå ã§ã¯ïŒtimeoutRef.currentã«å€ãããå ŽåãclearTimeoutã䜿çšããŠæ¢åã®ã¿ã€ã ã¢ãŠããã¯ãªã¢ããŸããsetTimeoutã䜿çšããŠæ°ããã¿ã€ã ã¢ãŠããèšå®ããŸãããã®ã¿ã€ã ã¢ãŠãã¯ã300ããªç§ã®éã¢ã¯ãã£ãç¶æ ãç¶ããåŸã«dispatch颿°ãïŒæŽæ°ããããã©ãŒã ããŒã¿ã§ïŒå®è¡ããŸãã- dispatchã®åŒã³åºãããã©ãŒã ã®å€ã«åºãããããŠã³ã¹ããã颿°å ã«ç§»åããŸããããã©ãŒã ã§ã¯ãªãæšæºã®inputèŠçŽ ã䜿çšãããµãŒããŒã¢ã¯ã·ã§ã³ãããã°ã©ã ã§ããªã¬ãŒããŸãã
ã¹ããã3ïŒããã©ãŒãã³ã¹ãšã¡ã¢ãªãªãŒã¯ã®æé©å
åã®å®è£
ã¯æ©èœããŸãããæœåšçãªã¡ã¢ãªãªãŒã¯ãé²ãããã«ããã«æé©åã§ããŸããã¿ã€ã ã¢ãŠããä¿çäžã®éã«ã³ã³ããŒãã³ããã¢ã³ããŠã³ãããããšãã¿ã€ã ã¢ãŠãã®ã³ãŒã«ããã¯ãããã§ãå®è¡ããããšã©ãŒãäºæããªãåäœã«ã€ãªããå¯èœæ§ããããŸããã³ã³ããŒãã³ããã¢ã³ããŠã³ããããéã«useEffectããã¯ã§ã¿ã€ã ã¢ãŠããã¯ãªã¢ããããšã§ããããé²ãããšãã§ããŸãïŒ
import React, { useState, useRef, useCallback, useEffect } from 'react';
import { useActionState } from 'react-dom/server';
async function updateDatabase(prevState: any, formData: FormData) {
// Simulate a database update
const text = formData.get('text') as string;
await new Promise(resolve => setTimeout(resolve, 500)); // Simulate network latency
return { success: true, message: `Updated with: ${text}` };
}
function MyComponent() {
const [debouncedText, setDebouncedText] = useState('');
const [state, dispatch] = useActionState(updateDatabase, {success: false, message: ""});
const timeoutRef = useRef(null);
const handleChange = (event: React.ChangeEvent) => {
const newText = event.target.value;
setDebouncedText(newText);
if (timeoutRef.current) {
clearTimeout(timeoutRef.current);
}
timeoutRef.current = window.setTimeout(() => {
const formData = new FormData();
formData.append('text', newText);
dispatch(formData);
}, 300);
};
useEffect(() => {
return () => {
if (timeoutRef.current) {
clearTimeout(timeoutRef.current);
}
};
}, []);
return (
<div>
<input type="text" value={debouncedText} onChange={handleChange} />
<p>{state.message}</p>
</div>
);
}
export default MyComponent;
空ã®äŸåé
åãæã€useEffectããã¯ã远å ããŸãããããã«ããããšãã§ã¯ãã¯ã³ã³ããŒãã³ãã®ããŠã³ãæãšã¢ã³ããŠã³ãæã«ã®ã¿å®è¡ãããŸãããšãã§ã¯ãã®ã¯ãªãŒã³ã¢ãã颿°ïŒãšãã§ã¯ãããè¿ããã颿°ïŒå
ã§ãã¿ã€ã ã¢ãŠããååšããã°ã¯ãªã¢ããŸããããã«ãããã³ã³ããŒãã³ããã¢ã³ããŠã³ããããåŸã«ã¿ã€ã ã¢ãŠãã³ãŒã«ããã¯ãå®è¡ãããã®ãé²ããŸãã
ä»£æ¿æ¡ïŒãããŠã³ã¹ã©ã€ãã©ãªã®äœ¿çš
äžèšã®å®è£
ã¯ãããŠã³ã¹ã®åºæ¬çãªæŠå¿µã瀺ããŠããŸãããå°çšã®ãããŠã³ã¹ã©ã€ãã©ãªã䜿çšãããšãã³ãŒããç°¡çŽ åãããšã©ãŒã®ãªã¹ã¯ãæžããããšãã§ããŸããlodash.debounceã®ãããªã©ã€ãã©ãªã¯ãå
ç¢ã§ååã«ãã¹ãããããããŠã³ã¹å®è£
ãæäŸããŸãã
以äžã¯ãlodash.debounceãuseActionStateãšå
±ã«äœ¿çšããæ¹æ³ã§ãïŒ
import React, { useState, useCallback, useEffect } from 'react';
import { useActionState } from 'react-dom/server';
import debounce from 'lodash.debounce';
async function updateDatabase(prevState: any, formData: FormData) {
// Simulate a database update
const text = formData.get('text') as string;
await new Promise(resolve => setTimeout(resolve, 500)); // Simulate network latency
return { success: true, message: `Updated with: ${text}` };
}
function MyComponent() {
const [debouncedText, setDebouncedText] = useState('');
const [state, dispatch] = useActionState(updateDatabase, {success: false, message: ""});
const debouncedDispatch = useCallback(debounce((text: string) => {
const formData = new FormData();
formData.append('text', text);
dispatch(formData);
}, 300), [dispatch]);
const handleChange = (event: React.ChangeEvent) => {
const newText = event.target.value;
setDebouncedText(newText);
debouncedDispatch(newText);
};
return (
<div>
<input type="text" value={debouncedText} onChange={handleChange} />
<p>{state.message}</p>
</div>
);
}
export default MyComponent;
ãã®äŸã§ã¯ïŒ
lodash.debounceããdebounce颿°ãã€ã³ããŒãããŸããuseCallbackãšdebounceã䜿çšããŠãdispatch颿°ã®ãããŠã³ã¹çãäœæããŸããuseCallbackããã¯ã¯ãããŠã³ã¹ããã颿°ãäžåºŠã ãäœæãããããšãä¿èšŒããäŸåé åã«dispatchãå«ããããšã§ãdispatch颿°ã倿Žãããå Žåã«ãããŠã³ã¹ããã颿°ãæŽæ°ãããããã«ããŸããhandleChange颿°ã§ã¯ãæ°ããããã¹ãã§debouncedDispatch颿°ãåŒã³åºãã ãã§ãã
ã°ããŒãã«ãªèæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹
ãããŠã³ã¹ãå®è£ ããéãç¹ã«ã°ããŒãã«ãªå©çšè ã察象ãšããã¢ããªã±ãŒã·ã§ã³ã§ã¯ã以äžã®ç¹ãèæ ®ããŠãã ããïŒ
- ãããã¯ãŒã¯é å»¶ïŒ ãããã¯ãŒã¯é å»¶ã¯ããŠãŒã¶ãŒã®å Žæããããã¯ãŒã¯ç¶æ³ã«ãã£ãŠå€§ããç°ãªãå¯èœæ§ããããŸããããå°åã§ããŸãæ©èœãããããŠã³ã¹é å»¶ããå¥ã®å°åã®ãŠãŒã¶ãŒã«ãšã£ãŠã¯çããããé·ããããããããšããããŸãããŠãŒã¶ãŒããããŠã³ã¹é å»¶ãã«ã¹ã¿ãã€ãºã§ããããã«ãããããããã¯ãŒã¯ç¶æ³ã«åºã¥ããŠé å»¶ãåçã«èª¿æŽããããšãæ€èšããŠãã ãããããã¯ãã¢ããªã«ãæ±åã¢ãžã¢ã®äžéšãªã©ãã€ã³ã¿ãŒãããã¢ã¯ã»ã¹ãäžå®å®ãªå°åã§äœ¿çšãããã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠç¹ã«éèŠã§ãã
- ã€ã³ãããã¡ãœãããšãã£ã¿ïŒIMEïŒïŒå€ãã®ã¢ãžã¢è«žåœã®ãŠãŒã¶ãŒã¯ãããã¹ãå ¥åã«IMEã䜿çšããŸãããããã®ãšãã£ã¿ã¯ã1æåãæ§æããããã«è€æ°ã®ããŒã¹ãããŒã¯ãå¿ èŠãšããããšããããããŸãããããŠã³ã¹é å»¶ãçããããšãIMEã®ããã»ã¹ã劚害ãããŠãŒã¶ãŒã«ãšã£ãŠãã©ã¹ãã¬ãŒã·ã§ã³ã®ããŸãäœéšã«ã€ãªããå¯èœæ§ããããŸããIMEã䜿çšããŠãããŠãŒã¶ãŒã®ããã«ãããŠã³ã¹é å»¶ãé·ãããããIMEã®åæã«ããé©ããã€ãã³ããªã¹ããŒã䜿çšããããšãæ€èšããŠãã ããã
- ã¢ã¯ã»ã·ããªãã£ïŒãããŠã³ã¹ã¯ãç¹ã«éåæ©èœã«é害ã®ãããŠãŒã¶ãŒã«ãšã£ãŠãã¢ã¯ã»ã·ããªãã£ã«åœ±é¿ãäžããå¯èœæ§ããããŸãããããŠã³ã¹é å»¶ãé·ãããªãããã«ããå¿ èŠã«å¿ããŠãŠãŒã¶ãŒãã¢ã¯ã·ã§ã³ãããªã¬ãŒããããã®ä»£æ¿æ¹æ³ãæäŸããŠãã ãããäŸãã°ããŠãŒã¶ãŒãã¯ãªãã¯ããŠæåã§ã¢ã¯ã·ã§ã³ãããªã¬ãŒã§ããéä¿¡ãã¿ã³ãæäŸããããšãèããããŸãã
- ãµãŒããŒè² è·ïŒãããŠã³ã¹ã¯ãµãŒããŒè² è·ã軜æžããã®ã«åœ¹ç«ã¡ãŸããããªã¯ãšã¹ããå¹ççã«åŠçããããã«ãµãŒããŒãµã€ãã®ã³ãŒããæé©åããããšãéèŠã§ãããã£ãã·ã³ã°ãããŒã¿ããŒã¹ã®ã€ã³ããã¯ã¹äœæããã®ä»ã®ããã©ãŒãã³ã¹æé©åæè¡ã䜿çšããŠããµãŒããŒãžã®è² è·ãæå°éã«æããŠãã ããã
- ãšã©ãŒãã³ããªã³ã°ïŒãµãŒããŒãµã€ãã®æŽæ°ããã»ã¹äžã«çºçããå¯èœæ§ã®ãããšã©ãŒãé©åã«åŠçããããã®å ç¢ãªãšã©ãŒãã³ããªã³ã°ãå®è£ ããŠãã ããããŠãŒã¶ãŒã«æçãªãšã©ãŒã¡ãã»ãŒãžã衚瀺ããã¢ã¯ã·ã§ã³ãå詊è¡ãããªãã·ã§ã³ãæäŸããŠãã ããã
- ãŠãŒã¶ãŒãã£ãŒãããã¯ïŒå ¥åãåŠçäžã§ããããšã瀺ãæç¢ºãªèŠèŠçãã£ãŒãããã¯ããŠãŒã¶ãŒã«æäŸããŠãã ãããããã«ã¯ãããŒãã£ã³ã°ã¹ãããŒãããã°ã¬ã¹ããŒããŸãã¯ãæŽæ°äž...ãã®ãããªã·ã³ãã«ãªã¡ãã»ãŒãžãå«ãŸããŸããæç¢ºãªãã£ãŒãããã¯ããªããšãç¹ã«ãããŠã³ã¹é å»¶ãæ¯èŒçé·ãå ŽåããŠãŒã¶ãŒã¯æ··ä¹±ãããäžæºãæãããããå¯èœæ§ããããŸãã
- ããŒã«ã©ã€ãŒãŒã·ã§ã³ïŒãšã©ãŒã¡ãã»ãŒãžãããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒããã®ä»ãŠãŒã¶ãŒã«è¡šç€ºããããã¹ãŠã®ããã¹ããã¡ãã»ãŒãžããç°ãªãèšèªãå°åã«åãããŠé©åã«ããŒã«ã©ã€ãºãããŠããããšã確èªããŠãã ããã
äŸïŒæ€çŽ¢ããŒã®ãããŠã³ã¹
ããå ·äœçãªäŸãšããŠãEã³ããŒã¹ã¢ããªã±ãŒã·ã§ã³ã®æ€çŽ¢ããŒãèããŠã¿ãŸãããããŠãŒã¶ãŒãå ¥åãããã³ã«ãµãŒããŒã«ãªã¯ãšã¹ããéããããªãããã«ãæ€çŽ¢ã¯ãšãªããããŠã³ã¹ããããšããŸãã
import React, { useState, useCallback, useEffect } from 'react';
import { useActionState } from 'react-dom/server';
import debounce from 'lodash.debounce';
async function searchProducts(prevState: any, formData: FormData) {
// Simulate a product search
const query = formData.get('query') as string;
await new Promise(resolve => setTimeout(resolve, 500)); // Simulate network latency
// In a real application, you would fetch search results from a database or API here
const results = [`Product A matching "${query}"`, `Product B matching "${query}"`];
return { success: true, message: `Search results for: ${query}`, results: results };
}
function SearchBar() {
const [searchQuery, setSearchQuery] = useState('');
const [state, dispatch] = useActionState(searchProducts, {success: false, message: "", results: []});
const [searchResults, setSearchResults] = useState([]);
const debouncedSearch = useCallback(debounce((query: string) => {
const formData = new FormData();
formData.append('query', query);
dispatch(formData);
}, 300), [dispatch]);
const handleChange = (event: React.ChangeEvent) => {
const newQuery = event.target.value;
setSearchQuery(newQuery);
debouncedSearch(newQuery);
};
useEffect(() => {
if(state.success){
setSearchResults(state.results);
}
}, [state]);
return (
<div>
<input type="text" placeholder="Search for products..." value={searchQuery} onChange={handleChange} />
<p>{state.message}</p>
<ul>
{searchResults.map((result, index) => (
<li key={index}>{result}</li>
))}
</ul>
</div>
);
}
export default SearchBar;
ãã®äŸã¯ãlodash.debounceãšuseActionStateã䜿çšããŠæ€çŽ¢ã¯ãšãªããããŠã³ã¹ããæ¹æ³ã瀺ããŠããŸããsearchProducts颿°ã¯è£œåæ€çŽ¢ãã·ãã¥ã¬ãŒãããSearchBarã³ã³ããŒãã³ãã¯æ€çŽ¢çµæã衚瀺ããŸããå®éã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãsearchProducts颿°ã¯ããã¯ãšã³ãAPIããæ€çŽ¢çµæãååŸããŸãã
åºæ¬çãªãããŠã³ã¹ãè¶ ããŠïŒé«åºŠãªãã¯ããã¯
äžèšã®äŸã¯åºæ¬çãªãããŠã³ã¹ã瀺ããŠããŸãããããã©ãŒãã³ã¹ãšãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãããã«æé©åããããã«äœ¿çšã§ãããããé«åºŠãªãã¯ããã¯ããããŸãïŒ
- ãªãŒãã£ã³ã°ãšããžã»ãããŠã³ã¹ïŒæšæºçãªãããŠã³ã¹ã§ã¯ã颿°ã¯é å»¶ã®åŸã«å®è¡ãããŸãããªãŒãã£ã³ã°ãšããžã»ãããŠã³ã¹ã§ã¯ã颿°ã¯é å»¶ã®éå§æã«å®è¡ãããé å»¶äžã®åŸç¶ã®åŒã³åºãã¯ç¡èŠãããŸããããã¯ããŠãŒã¶ãŒã«å³åº§ã«ãã£ãŒãããã¯ãæäŸãããã·ããªãªã§åœ¹ç«ã¡ãŸãã
- ãã¬ã€ãªã³ã°ãšããžã»ãããŠã³ã¹ïŒããã¯æšæºçãªãããŠã³ã¹æè¡ã§ã颿°ã¯é å»¶ã®åŸã«å®è¡ãããŸãã
- ã¹ããããªã³ã°ïŒã¹ããããªã³ã°ã¯ãããŠã³ã¹ã«äŒŒãŠããŸãããéã¢ã¯ãã£ãæéã®åŸã«å®è¡ãé å»¶ãããã®ã§ã¯ãªãã颿°ãåŒã³åºãããã¬ãŒããå¶éããŸããäŸãã°ã颿°ã100ããªç§ã«1åããåŒã³åºãããªãããã«ã¹ãããã«ããããšãã§ããŸãã
- ã¢ãããã£ãã»ãããŠã³ã¹ïŒã¢ãããã£ãã»ãããŠã³ã¹ã¯ããŠãŒã¶ãŒã®è¡åããããã¯ãŒã¯ç¶æ³ã«åºã¥ããŠãããŠã³ã¹é å»¶ãåçã«èª¿æŽããŸããäŸãã°ããŠãŒã¶ãŒã®ã¿ã€ãã³ã°ãéåžžã«é ãå Žåã¯ãããŠã³ã¹é å»¶ãçããããããã¯ãŒã¯é å»¶ãé«ãå Žåã¯é å»¶ãé·ãããããšãã§ããŸãã
çµè«
ãããŠã³ã¹ã¯ãã€ã³ã¿ã©ã¯ãã£ããªWebã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæé©åããããã®éèŠãªãã¯ããã¯ã§ããReactã®useActionStateããã¯ã¯ãç¹ã«React Server ComponentsããµãŒããŒã¢ã¯ã·ã§ã³ãšçµã¿åãããããšã§ããããŠã³ã¹ãå®è£
ããããã®åŒ·åã§æŽç·Žãããæ¹æ³ãæäŸããŸãããããŠã³ã¹ã®ååãšuseActionStateã®æ©èœãçè§£ããããšã§ãéçºè
ã¯ã°ããŒãã«ã«ã¹ã±ãŒã«ãããå¿çæ§ãé«ããå¹ççã§ããŠãŒã¶ãŒãã¬ã³ããªãŒãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸããã°ããŒãã«ãªå©çšè
ã察象ãšããã¢ããªã±ãŒã·ã§ã³ã§ãããŠã³ã¹ãå®è£
ããéã¯ããããã¯ãŒã¯é
å»¶ãIMEã®äœ¿çšãã¢ã¯ã»ã·ããªãã£ãªã©ã®èŠå ãèæ
®ããããšãå¿ããªãã§ãã ãããã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®èŠä»¶ã«åºã¥ããŠãé©åãªãããŠã³ã¹æè¡ïŒãªãŒãã£ã³ã°ãšããžããã¬ã€ãªã³ã°ãšããžããŸãã¯ã¢ãããã£ãïŒãéžæããŠãã ãããlodash.debounceã®ãããªã©ã€ãã©ãªã掻çšããŠãå®è£
ãç°¡çŽ åãããšã©ãŒã®ãªã¹ã¯ãæžãããŸãããããããã®ã¬ã€ãã©ã€ã³ã«åŸãããšã§ãã¢ããªã±ãŒã·ã§ã³ãäžçäžã®ãŠãŒã¶ãŒã«ã¹ã ãŒãºã§æ¥œããäœéšãæäŸããããšãä¿èšŒã§ããŸãã